package io.sdph.products;

import io.sdph.products.exceptions.ProductException;
import io.sdph.products.model.Product;

import java.util.List;

/**
 * Interfejs managera zarządzającego produktami.
 * 
 * @author Konrad Szewczyk
 * @since 0.0.1
 */
public interface IProductManager {
	
	/**
	 * Metoda dodaje produkt.
	 * 
	 * @param product - obiekt klasy Product
	 * @throws ProductException - w przypadku błędu
	 */
	public void addProduct(Product product) throws ProductException;
	
	/**
	 * Metoda zapisuje istniejący produkt.
	 * 
	 * @param product - obiekt klasy Product
	 * @throws ProductException - w przypadku błędu
	 */
	public void modifyProduct(Product product) throws ProductException;
	
	/**
	 * Metoda usuwa produkt.
	 * 
	 * @param product - obiekt klasy Product
	 * @throws ProductException - w przypadku błędu
	 */
	public void deleteProduct(Product product) throws ProductException;
	
	/**
	 * Metoda pobiera produkt o danym id.
	 * 
	 * @param id - identyfikator produktu
	 * @return obiekt produktu lub null jeśli znie znajdzie
	 * @throws ProductException
	 */
	public Product getProduct(String id) throws ProductException;
	
	/**
	 * Zwraca listę produktów posortowanych rosnąco po nazwie w limiatach limitFrom do limiTo.
	 * 
	 * @param limitFrom - od którego elementu ma zwrócić (jeśli null to od pierwszego)
	 * @param limitTo - do którego elementu ma zwrócić (jeśli null to do ostatniego)
	 * @return lista produktów
	 * @throws ProductException
	 */
	public List<Product> getProducts(Long limitFrom, Long limitTo) throws ProductException;
	
	/**
	 * Zwraca listę produktów, które w nazwie zawierają frazę name.
	 * 
	 * @param name - fraza
	 * @param limitFrom - od którego elementu ma zwrócić (jeśli null to od pierwszego)
	 * @param limitTo - do którego elementu ma zwrócić (jeśli null to do ostatniego)
	 * @return lista produktów
	 * @throws ProductException
	 */
	public List<Product> getProductsByName(String name, Long limitFrom, Long limitTo) throws ProductException;
	
	/**
	 * Zwraca listę produktów, które przynależą do kategorii o podanej nazwie.
	 * 
	 * @param categoryName - nazwa kategorii
	 * @param limitFrom - od którego elementu ma zwrócić (jeśli null to od pierwszego)
	 * @param limitTo - do którego elementu ma zwrócić (jeśli null to do ostatniego)
	 * @return lista produktów
	 * @throws ProductException
	 */
	public List<Product> getProductsByCategory(String categoryName, Long limitFrom, Long limitTo) throws ProductException;
	
}
